package com.cskaoyan.javase.oop3._1interface._2notice;

/**
 * Java8中的默认方法和静态方法,接口中带有大括号的实现方法
 * 1.默认方法,对应关键字default声明的一种方法,所以叫默认方法
 *      语法:
 *      public default 返回值类型 方法名(形参列表){
 *          // 方法体
 *      }
 *      public是隐含的修饰符,请省略它.
 *      接口中的默认方法,可以当成抽象类中的成员方法去使用
 *          即创建子类(实现类)对象继承然后使用
 *          并且默认方法,不需要强制接口实现类实现,当然可以选择重写
 *      什么时候接口中需要定义默认方法呢?
 *          假如接口的所有实现类都需要一个默认实现,那么这个默认实现就可以写在接口中
 *          (实际上这种需求,几乎没有,即便有也不建议在接口中定义默认方法)
 *          Java8中引入了Lambda表达式和StreamAPI
 *          接口中的默认方法可以作为它们的实现，完成函数式编程。
 *
 *      2.静态方法,对应关键字static,所以叫静态方法
 *      语法:
 *      public static 返回值类型 方法名(形参列表){
 *          // 方法体
 *      }
 *      public是隐含的修饰符,请省略它.
 *      既然是静态方法,那就接口名点调用它
 *      注意: 接口中静态方法,不能给子类用,只能自己用
 *      这个语法基本没用,它也是为了配合Java8诞生的Lambda表达式和StreamAPI使用的
 *      日常开发中,请大家不要定义.
 *
 *
 * @since 10:04
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        new IAImpl().test2();
        IA.test3();
        // IAImpl.
    }
}

class IAImpl implements IA {
    @Override
    public void test() {
    }

    @Override
    public void test2() {
        System.out.println("6666");
    }
}

interface IA {
    void test();

    // 默认方法
    default void test2() {
        System.out.println("hello world!");
    }

    // 静态方法
    static void test3(){
        System.out.println("我是一个静态方法!");
    }
}